use std::collections::HashMap;
use std::f32::consts::E;
use std::fs::File;
use std::io;
use std::io::{ErrorKind, Read};
use log::error;

pub fn map_func() {
    let mut s = HashMap::new();
    s.insert(String::from("abc"), 24);


    let teams = vec![String::from("Blue"), String::from("Yellow")];
    let intial_scores = vec![10, 50];

    let scores: HashMap<_, _> = teams.iter().zip(intial_scores.iter()).collect();

    for x in scores.iter() {
        println!("{:?}", x);
    }

    for (k,v) in &scores {
        println!("{}:{}",k,v);
    }

    let text = "hello world hello dear";

    let mut map = HashMap::new();

    // entry 检查每个key是否都有值
    for word in text.split_whitespace() {
        let count = map.entry(word).or_insert(0);
        *count += 1;
    }

    println!("{:#?}",map);


    // hash函数    默认情况下，HashMap使用加密功能强大的Hash函数，可以抵抗拒绝服务（Dos）攻击，- 不是可用的最快的Hash算法  - 但具有更好安全性
    // 可以指定不同的hasher来切换到另一个函数   - hasher 是实现BuildHasher trait 的类型


    let f  = File::open("hello.txt");
    // let f = match f {
    //     Ok(file) => file,
    //     Err(error) => {
    //         panic!("Error opening file {:?}",error)
    //     }
    // };
    // 下面此写法跟上面的实现结果一致
    let f = File::open("hello.txt").unwrap();
    let f = File::open("hello.txt").expect("找不到文件！");
    
    // let f = match f {
    //     Ok(file) => file,
    //     Err(error) => match error.kind() {
    //         ErrorKind::NotFound => match File::created("hello.txt") {
    //             Ok(fc) => fc,
    //             Err(e) => panic!("Error creating file: {:?}",e);
    //         }
    //         other_error => panic!("Error opening the file: {:?}",other_error),
    //     },
    // };

    let f =  File::open("hello.txt").unwrap_or_else(|error| {
        if error.kind() == ErrorKind::NotFound {
            File::create("hello.txt").unwrap_or_else(|error| {
                panic!("Error creating file: {:?}",error);
            })
        } else {
            panic!("Error opening file: {:?}",error);
        }
    });

    // unwrap: match表达式的一个快捷方法：  -如果Result结果是Ok，返回Ok里面的值



}

fn read_username_from_file() -> Result<String,io::Error> {
    let mut f = File::open("hello.txt")?;
    // 上下代码实现逻辑一致
    // let mut w = match File::open("hello.txt") {
    //     Ok(file) => file,
    //     Err(e) => return Err(e),
    // };

    let mut s = String::new();
    // 上下代码实现逻辑一致
    // match w.read_to_string(&mut s) {
    //     Ok(_) => Ok(s),
    //     Err(e) =>Err(e),
    // }
    f.read_to_string(&mut s)?;
    Ok(s)
}
// 上下代码实现的逻辑一致
fn read_username_from_file_one() -> Result<String,io::Error> {
    let mut s = String::new();
    File::open("hello.txt")?.read_to_string(&mut s)?;
    Ok(s)
}

// ？运算符只能用于返回Result的函数